import mypackage.Student;

/*
定义一个长度为3的数组，数组存储1~3名学生对象作为初始数据，
学生对象的学号，姓名各不相同。学生的属性:学号，姓名，年龄。

要求1:再次添加一个学生对象，并在添加的时候进行学号的唯一性判断。

要求2:添加完毕之后，遍历所有学生信息。
要求3:通过id删除学生信息
如果存在，则删除，
如果不存在，则提示删除失败。

要求4:删除完毕之后，遍历所有学生信息。

要求5:查询数组id为2的学生，
如果存在，则将他的年龄+1岁
*/

public class Main2 {
    public static void main(String[] args) {
        /*
        * 1
        * 定义一个长度为3的数组，数组存储1~3名学生对象作为初始数据，
        * 学生对象的学号，姓名各不相同。学生的属性:学号，姓名，年龄。
        * */
        Student[] stu=new Student[3];
        stu[0]=new Student(1,"张三",20);
        stu[1]=new Student(2,"李四",21);
        stu[2]=new Student(3,"王五",22);

        Student newstudent=new Student(4,"赵六",23);

        //要求1:再次添加一个学生对象，并在添加的时候进行学号的唯一性判断。
        stu=insertStudentArr(stu,newstudent);

        //要求2:添加完毕之后，遍历所有学生信息。
        showStudentArr(stu);

        /*
        要求3:通过id删除学生信息
        如果存在，则删除，
        如果不存在，则提示删除失败。
        */
        int id=2;
        eraseStudentArr(stu,id);

        //要求4:删除完毕之后，遍历所有学生信息。
        showStudentArr(stu);

        /*
        要求5:查询数组id为1的学生，
        如果存在，则将他的年龄+1岁
        */
        id=1;
        changeStudentAge(stu,id);

    }
    public static Student[] insertStudentArr(Student[] stu,Student newstudent){
        //要求1:再次添加一个学生对象，并在添加的时候进行学号的唯一性判断。
        //拆分问题1.1学号唯一性判定:
        int index=findStudent(stu,newstudent.getId());
        if(index==-1){
            //-1说明不存在,可以进行添加操作
            //1.2添加,添加操作又分为两种,
            //1 数组没有满的情况下,2 数组存满的情况下
            //1判断数组有没有满
            int count=getStudentLength(stu);
            if(count==-1){
                //-1说明是数组满了

                //1要先扩内存
                stu=explorStudentArr(stu);

                //2再进行添加
                stu[stu.length-1]=newstudent;
            }else{
                //没满,则直接将数组对应的下标进行复制
                stu[count]=newstudent;
            }
        }else{
            //说明该学号已经存在,输出提示一下
            System.out.println("该学号已经存在,请重新输入");
        }
        return stu;
    }
    public static int findStudent(Student[] stu,int id){
        for (int i = 0; i < stu.length; i++) {
            Student now=stu[i];
            if(now!=null){
                //非空性判定,避免直接判断null.getId()报错
                if(now.getId()==id){
                    return i;
                }
            }
        }
        return -1;
    }
    public static int getStudentLength(Student[] stu){
        for (int i = 0; i < stu.length; i++) {
            Student now=stu[i];
            if(now==null){
                return i;
            }//有一个为空说明数组没满,返回该下标
        }
        //整个for遍历完了,依然没找到null的对象,说明该数组存满了
        return -1;
    }
    public static Student[] explorStudentArr(Student[] stu){
        int len=stu.length;
        Student[] newStudent=new Student[len+1];
        for (int i = 0; i < stu.length; i++) {
            newStudent[i]=stu[i];
        }
        //len+1-1下标对应的位置为默认值null;
        return newStudent;
    }
    public static void showStudentArr(Student[] stu){
        //要求2:添加完毕之后，遍历所有学生信息。
        for (int i = 0; i < stu.length; i++) {
            Student now=stu[i];
            if(now!=null){
                //非空判定,避免没满的情况下访问对象成员方法
                System.out.println("Id="+now.getId()+"Name="+now.getName()+"Age="+now.getAge());
            }
        }
        System.out.println();
    }
    public static void eraseStudentArr(Student[] stu,int id){
        /*
        要求3:通过id删除学生信息
        如果存在，则删除，
        如果不存在，则提示删除失败。
        */
        //3.1找id
        int index=findStudent(stu,id);
        //3.2判断存在
        if(index==-1){
            System.out.println("该学号不存在,删除失败");
        }else{
            //存在,直接将对应元素的下标置空
            stu[index]=null;
        }
    }
    public static void changeStudentAge(Student[] stu,int id){
        int index=findStudent(stu,id);
        if(index==-1){
            //说明不存在,输出提示一下
            System.out.println("没有该学生");
        }else{
            int age=stu[index].getAge();
            stu[index].setAge(age+1);
        }
    }
}

